function curry(f) { // 洋葱函数
  return function(a) {
    return function (b) {
      return f(a, b);
    }
  }
}

function sum (a, b) {
  return a + b;
}

let curriedSum = curry(sum); // 第1步执行  扒了第1层  返回是一个函数
let secondStep = curriedSum(1); // 第2步执行 扒了第2层 此时在词法作用域中 保存了a = 1
console.log(secondStep.toString()); // 打印第2层的返回  也是一个函数
let thirdStep = secondStep(2) // 第3步执行 扒了第3层 返回最终结果3
console.log('最终执行结果', thirdStep)
console.log('与一次性执行，返回结果一致', curry(sum)(1)(2));

function log(date, importance, message) {
  let time = `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}-${date.getHours()}:${date.getMinutes()}:${date.getSeconds()}`
  console.log(`${time}-${importance}-${message}`);
}

log(new Date(), 'INFO', 'test')

function curry(func) {
  return function curried(...args) {
    if (args.length >= func.length) {
      return func.apply(this, args);
    } else {
      return function(...args2) {
        return curried.apply(this, args.concat(args2));
      }
    }
  };
}

let currTimeLog = curry(log)(new Date)
currTimeLog('INFO', 'requestOK')
currTimeLog('WARNING', 'requestBad')
currTimeLog('Error', 'request500')

let currTimeINFOLog = currTimeLog('INFO')
currTimeINFOLog('getNameOK')
currTimeINFOLog('getAgeOK')
currTimeINFOLog('getSexOK')

function getUserInfo(name, age, sex) {
  return `${name}-${age}-${sex};`
}

let curriedGetUserInfo = curry(getUserInfo);

console.log(curriedGetUserInfo('小可爱', '2', '闺女')); // 6，仍然可以被正常调用
console.log(curriedGetUserInfo('小可爱')('2','闺女')); // 6，对第一个参数的柯里化
console.log(curriedGetUserInfo('小可爱')('2')('闺女')); // 6，全柯里化

console.log(getUserInfo.length)